通知参数

Exisi 2022-11-28 08:50:21
Categories: Tags:

AspectJ提供了以下通知参数进行传递:

通知参数

描述

适用

JoinPoint

表示正在执行的业务方法,相当于放射中的method

提供访问当前被通知方法的目标对象、代理对象、方法参数等数据

使用必须是多参数中的第一个

@Aspect

@AfterReturning

@AfterThrowing

@After

ProceedingJoinPoint

用于环绕通知,继承于JoinPoint,替代JoinPoint

proceed()方法用于执行目标方法

若目标有返回值,则该方法的返回值就是目标方法的返回值

@Around

JoinPoint.StaticPart

提供访问连接点的静态部分,如被通知方法签名、连接点类型等

@Aspect

@AfterReturning

@AfterThrowing

@After

 

 

 

使用JoinPoint获取

Spring AOP提供使用org.aspectj.lang.JoinPoint类型获取连接点数据,任何通知方法的第一个参数 都可以是JoinPoint

(环绕通知是ProceedingJoinPointJoinPoint子类),当然第一个参数位置也可以是JoinPoint.StaticPart类型,这个只返回连接点的静态部分

方法

类型

描述

toString()

String

连接点所在位置的相关信息 

toShortString()

String

连接点所在位置的简短相关信息 

toLongString()

String

连接点所在位置的全部相关信息 

getThis()

Object

返回AOP代理对象 

getTarget()

Object

返回目标对象 

getArgs()

Object[]

返回被通知方法参数列表 

getSignature()

Signature

返回当前连接点签名 

getSourceLocation()

SourceLocation

返回连接点方法所在类文件中的位置 

getKind()

String

连接点类型 

getStaticPart()

StaticPart

返回连接点静态部分

示例

@Before("pointCut()")  

public void doBefore(JoinPoint joinPoint) {

        // 获取签名

        Signature signature = joinPoint.getSignature();

        // 获取切入的包名

        String declaringTypeName = signature.getDeclaringTypeName();

        // 获取即将执行的方法名

        String funcName = signature.getName();

        // 也可以用来记录一些信息,比如获取请求的 URL 和 IP

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = attributes.getRequest();

        // 获取请求 URL

        String url = request.getRequestURL().toString();

        // 获取请求 IP

        String ip = request.getRemoteAddr();       

}

示例

@AfterThrowing(pointcut = "pointCut()", throwing = "ex")

public void afterThrowing(Throwable ex) {

        Signature signature = joinPoint.getSignature();

        String method = signature.getName();

 log.info("执行方法{}出错,异常为:{}", method, ex);

 }

示例

@AfterThrowing(pointcut = "pointCut()", throwing = "ex")

public void afterThrowing(JoinPoint joinPoint, Throwable ex) {

        Signature signature = joinPoint.getSignature();

        String method = signature.getName();

}

 

 

 

使用ProceedingJoinPoint获取

用于环绕通知,使用proceed()方法来执行目标方法

示例

@Around("permissionCheck()")

public Object permissionCheck(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("===================开始增强处理===================");

 

        //获取请求参数,详见接口类

        Object[] objects = joinPoint.getArgs();

        Long id = ((JSONObject) objects[0]).getLong("id");

        String name = ((JSONObject) objects[0]).getString("name");

        System.out.println("id1->>>>>>>>>>>>>>>>>>>>>>" + id);

        System.out.println("name1->>>>>>>>>>>>>>>>>>>>>>" + name);

 

        // 修改入参

        JSONObject object = new JSONObject();

        object.put("id", 8);

        object.put("name", "lisi");

        objects[0] = object;

        

        // 将修改后的参数传入,joinPoint.proceed()为目标对象执行原结果

        return joinPoint.proceed(objects);

}

 

 

 

使用JoinPoint.StaticPart获取

提供访问连接点的静态部分,如被通知方法签名、连接点类型等

方法

类型

描述

getSignature()

Signature

返回当前连接点签名 

getKind()

String

连接点类型 

getId()

int

唯一标识 

toString()

String

连接点所在位置的相关信息 

toShortString()

String

连接点所在位置的简短相关信息 

toLongString()

String

连接点所在位置的全部相关信息